﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;



namespace TerhelesEloszto.Common
{
	/// <summary>
	/// A szemeszterek lehetséges tipusai
	/// </summary>
	public enum SemesterType { spring, autumn, both }

	/// <summary>
	/// Évközi feladatot reprezentáló interfész.
	/// </summary>
	public interface ITask
	{
		/// <summary>
		/// A feladat neve.
		/// </summary>
		string Name { get; }

		/// <summary>
		/// A feladathoz tartozó tantárgy.
		/// </summary>
		IFact RelatedFact { get; }

		/// <summary>
		/// A feladathoz tartozó tantárgy.
		/// </summary>
		/// <returns>A feladathoz tartozó tantárgy.</returns>
		IFact GetRelatedFact();

		/// <summary>
		/// A feladat típusa.
		/// </summary>
		ITaskType Type { get; }

		/// <summary>
		/// A feladat típusa.
		/// </summary>
		/// <returns>A feladat típusa.</returns>
		ITaskType GetType();

		/// <summary>
		/// A feladathoz tartozó időintervallumok.
		/// </summary>
		List<IInterval> TimeIntervals { get; }

		/// <summary>
		/// A feladathoz tartozó időintervallumok.
		/// </summary>
		/// <returns>A feladathoz tartozó időintervallumok.</returns>
		List<IInterval> GetTimeIntervals();

		/// <summary>
		/// A feladat elvégzéséhez szükséges szakmai preferenciák.
		/// </summary>
		List<ISkill> RequiredSkills { get; }

		/// <summary>
		/// A feladat elvégzéséhez szükséges szakmai preferenciák.
		/// </summary>
		/// <returns>A feladat elvégzéséhez szükséges szakmai preferenciák.</returns>
		List<ISkill> GetRequiredSkills();

		/// <summary>
		/// Azon oktatók listája, akik a feladatot elvégezhetik a szakmai preferenciáik alapján.
		/// </summary>		
		List<ITeacher> PossibleTeachers { get; }

		/// <summary>
		/// Azon oktatók listája, akik a feladatot elvégezhetik a szakmai preferenciáik alapján.
		/// </summary>
		/// <returns>Azon oktatók listája, akik a feladatot elvégezhetik a szakmai preferenciáik alapján.</returns>
		List<ITeacher> GetPossibleTeachers();

		/// <summary>
		/// A feladathoz hozzárendelt oktató.
		/// </summary>
		ITeacher RelatedTeacher { get; set; }

		/// <summary>
		/// A feladathoz hozzárendelt oktató.
		/// </summary>
		/// <returns>A feladathoz hozzárendelt oktató.</returns>
		ITeacher GetRelatedTeacher();

		/// <summary>
		/// A feladat heti óraszáma.
		/// </summary>
		int Hours { get; }

		/// <summary>
		/// A taskhoz tartozó szemeszter.
		/// </summary>
		SemesterType Semester { get; }

		/// <summary>
		/// A feladat azonosítója.
		/// </summary>
		int ID { get; }

		/// <summary>
		/// Igaz értékkel tér vissza ha ütközik a másik taskkal (a szemesztert nem vizsgálja.)
		/// </summary>
		/// <param name="other">A másik task.</param>
		/// <returns> Igaz értékkel tér vissza ha ütközik a másik taskkal (a szemesztert nem vizsgálja.) </returns>
		bool HasIntersect( ITask other );

		/// <summary>
		/// A task két heti összes óraszámát adja vissza.
		/// </summary>
		/// <returns>A task két heti összes óraszámát adja vissza.</returns>
		int GetHoursOnTwoAWeek();
	}
}
